import axios from "axios";
import cache from "./cache";
import { notification, Modal } from "antd";
import { getToken } from "./index.js";
import { ExclamationCircleFilled } from "@ant-design/icons";
const { confirm } = Modal;
// 基础配置
const http = axios.create({
  baseURL: "https://xcx.wljc0898.com/prod-api",
  timeout: 5000,
});

// 请求拦截
http.interceptors.request.use(
  (config) => {
    // 是否需要设置 token
    const isToken = (config.headers || {}).isToken === false;
    if (getToken() && !isToken) {
      config.headers["Authorization"] = "Bearer " + getToken();
    }
    // 是否需要防止数据重复提交
    const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
    if (!isRepeatSubmit && ["post", "put"].includes(config.method)) {
      const requestObj = {
        url: config.url,
        data:
          typeof config.data === "object"
            ? JSON.stringify(config.data)
            : config.data,
        time: new Date().getTime(),
      };
      const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小
      const limitSize = 5 * 1024 * 1024; // 限制存放数据5M
      if (requestSize >= limitSize) {
        console.warn(
          `[${config.url}]: ` +
            "请求数据大小超出允许的5M限制,无法进行防重复提交验证。"
        );
        return config;
      }
      const sessionObj = cache.session.getJSON("sessionObj");
      if (
        sessionObj === undefined ||
        sessionObj === null ||
        sessionObj === ""
      ) {
        cache.session.setJSON("sessionObj", requestObj);
      } else {
        const s_url = sessionObj.url; // 请求地址
        const s_data = sessionObj.data; // 请求数据
        const s_time = sessionObj.time; // 请求时间
        const interval = 1000; // 间隔时间(ms)，小于此时间视为重复提交
        if (
          s_data === requestObj.data &&
          requestObj.time - s_time < interval &&
          s_url === requestObj.url
        ) {
          const message = "数据正在处理，请勿重复提交";
          console.warn(`[${s_url}]: ` + message);
          return Promise.reject(new Error(message));
        } else {
          cache.session.setJSON("sessionObj", requestObj);
        }
      }
    }
    return config;
  },
  (error) => {
    Promise.reject(error);
  }
);

// 响应拦截
http.interceptors.response.use(
  (res) => {
    // 未设置状态码则默认成功状态
    const code = res.data.code || 200;
    // 获取错误信息
    const errorCode = {
      401: "认证失败，无法访问系统资源",
      403: "当前操作没有权限",
      404: "访问资源不存在",
      default: "系统未知错误，请反馈给管理员",
    };
    const msg = errorCode[code] || res.data.msg || errorCode["default"];
    // 二进制数据则直接返回
    if (["blob", "arraybuffer"].includes(res.request.responseType))
      return res.data;
    if (code === 401) {
      let isRelogin = {
        show: true,
      };
      if (!isRelogin.show) {
        isRelogin.show = true;
        confirm({
          title: "提示",
          icon: <ExclamationCircleFilled />,
          okText: "重新登录",
          okType: "danger",
          cancelText: "取消",
          content: "登录状态已过期，您可以继续留在该页面，或者重新登录",
          onOk: () => {
            isRelogin.show = false;
          },
          onCancel: () => {
            isRelogin.show = false;
          },
        });
      }
      return Promise.reject("无效的会话，或者会话已过期，请重新登录。");
    } else if (code === 500) {
      notification.error({
        message: "提示",
        description: msg,
        showProgress: true,
        pauseOnHover: true,
      });
      return Promise.reject(new Error(msg));
    } else if (code === 601) {
      notification.error({
        message: "提示",
        description: msg,
        showProgress: true,
        pauseOnHover: true,
      });
      return Promise.reject("error");
    } else if (code !== 200) {
      notification.error({
        message: "提示",
        description: msg,
        showProgress: true,
        pauseOnHover: true,
      });
      return Promise.reject("error");
    } else {
      return res.data;
    }
  },
  (error) => {
    let { message } = error;
    if (message == "Network Error") {
      message = "后端接口连接异常";
    } else if (message.includes("timeout")) {
      message = "系统接口请求超时";
    } else if (message.includes("Request failed with status code")) {
      message = "系统接口" + message.substr(message.length - 3) + "异常";
    }
    notification.error({
      message: "提示",
      description: message,
      showProgress: true,
      pauseOnHover: true,
    });
    return Promise.reject(error);
  }
);

export { http };
